package br.com.viewcar.web.bean;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import javax.faces.model.SelectItem;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import br.com.viewcar.entity.Cliente;
import br.com.viewcar.entity.Grupo;
import br.com.viewcar.entity.Permissao;
import br.com.viewcar.entity.Usuario;
import br.com.viewcar.entity.Veiculo;
import br.com.viewcar.service.GrupoService;
import br.com.viewcar.service.PermissaoService;
import br.com.viewcar.service.UsuarioService;
import br.com.viewcar.service.VeiculoService;
import br.com.viewcar.util.CheckrotaUtil;

@Scope("session")
@Component("usuarioBean")
public class UsuarioBean extends EntityBean<Integer, Usuario> {

	@Autowired
	private UsuarioService service;

	@Autowired
	private GrupoService grupoService;

	@Autowired
	private VeiculoService veiculoService;

	@Autowired
	private PermissaoService permissaoService;

	private Grupo grupo;

	private Veiculo veiculo;

	private Permissao permissao;

	private Integer clienteVeiculoId;

	private Integer clienteGrupoId;

	protected Integer retrieveEntityId(Usuario entity) {

		return entity.getId();
	}

	protected UsuarioService retrieveEntityService() {

		return this.service;
	}

	protected Usuario createNewEntity() {

		Usuario usuario = new Usuario();

		usuario.setCliente(new Cliente());

		usuario.setGrupos(new ArrayList<Grupo>());

		usuario.setPermissoes(new ArrayList<Permissao>());

		return usuario;
	}

	public Grupo getGrupo() {

		if (grupo == null) {

			grupo = new Grupo();
		}

		return grupo;
	}

	public Veiculo getVeiculo() {

		if (veiculo == null) {

			veiculo = new Veiculo();
		}

		return veiculo;
	}

	public Permissao getPermissao() {

		if (permissao == null) {

			permissao = new Permissao();
		}

		return permissao;
	}

	public void setPermissao(Permissao permissao) {

		this.permissao = permissao;
	}

	public void setVeiculo(Veiculo veiculo) {

		this.veiculo = veiculo;
	}

	public void setGrupo(Grupo grupo) {

		this.grupo = grupo;
	}	

	public Integer getClienteVeiculoId() {

		return clienteVeiculoId;
	}

	public void setClienteVeiculoId(Integer clienteVeiculoId) {

		this.clienteVeiculoId = clienteVeiculoId;
	}

	public Integer getClienteGrupoId() {

		return clienteGrupoId;
	}

	public void setClienteGrupoId(Integer clienteGrupoId) {

		this.clienteGrupoId = clienteGrupoId;
	}

	public boolean getPermissaoStatus() {

		return getListaPermissoes().size() > 0;
	}

	public boolean getGrupoStatus() {

		return getListaGrupos().size() > 0;
	}

	public boolean getGruposClienteStatus() {

		return getListaGruposByCliente().size() > 0;
	}	

	public String getUsuarioLogado() {

		return CheckrotaUtil.retrieveUsuarioLogado().getLogin();
	}

	public String populate(){

		return SUCCESS;
	}

	public String addPermissao() {

		permissao = permissaoService.retrieve(permissao.getId());

		this.entity.getPermissoes().add(permissao);

		permissao = new Permissao();

		return SUCCESS;
	}


	public String addGrupo() {

		grupo = grupoService.retrieve(grupo.getId());

		this.entity.getGrupos().add(grupo);

		grupo = new Grupo();

		return SUCCESS;
	}

	public List<SelectItem> getListaPermissoes() {

		List<SelectItem> result = new ArrayList<SelectItem>();

		List<Permissao> permissoes = permissaoService.retrieveAll();

		permissoes.removeAll(this.entity.getPermissoes());

		Collections.sort(permissoes, new Comparator<Permissao>() {

			public int compare(Permissao o1, Permissao o2) {

				return o1.getDescricao().compareTo(o2.getDescricao());

			}
		});

		for (Permissao permissao : permissoes) {

			result.add(new SelectItem(permissao.getId(), permissao.getDescricao()));
		}

		return result;
	}


	public List<SelectItem> getListaGrupos() {

		List<SelectItem> result = new ArrayList<SelectItem>();

		List<Grupo> grupos = grupoService.retrieveAll();

		if(grupos != null && grupos.size() > 0){

			grupos.removeAll(this.entity.getGrupos());

			Collections.sort(grupos, new Comparator<Grupo>() {

				public int compare(Grupo o1, Grupo o2) {

					return o1.getNome().compareTo(o2.getNome());

				}
			});

			for (Grupo grupo : grupos) {

				result.add(new SelectItem(grupo.getId(), grupo.getNome()));
			}
		}

		return result;
	}

	public List<SelectItem> getListaGruposByCliente(){

		List<SelectItem> result = new ArrayList<SelectItem>();

		List<Grupo> grupos = grupoService.findByCliente(clienteGrupoId);

		grupos.removeAll(this.entity.getGrupos());

		Collections.sort(grupos, new Comparator<Grupo>() {

			public int compare(Grupo o1, Grupo o2) {

				return o1.getNome().compareTo(o2.getNome());

			}
		});

		for (Grupo grupo : grupos) {

			result.add(new SelectItem(grupo.getId(), grupo.getNome()));
		}

		return result;
	}

	public List<SelectItem> getListaUsuarios() {

		List<SelectItem> result = new ArrayList<SelectItem>();

		List<Usuario> usuarios = service.retrieveAll();

		Collections.sort(usuarios, new Comparator<Usuario>() {

			public int compare(Usuario o1, Usuario o2) {

				return o1.getNome().compareTo(o2.getNome());

			}
		});

		if(usuarios != null && usuarios.size() > 0 ){

			result.add(new SelectItem(null, "Selecione"));

			for (Usuario usuario : usuarios) {

				result.add(new SelectItem(usuario.getId(), usuario.getNome()));
			}
		}

		return result;
	}

	public String delPermissao() {

		this.entity.getPermissoes().remove(permissao);

		return SUCCESS;
	}

	public String delGrupo() {

		this.entity.getGrupos().remove(grupo);

		return SUCCESS;
	}

	public String trocarSenha() {

		Usuario usuario = retrieveEntityService().retrieve(this.entity.getId());

		usuario.setSenha(this.entity.getSenha());

		retrieveEntityService().update(usuario);

		return search();
	}
}